package module

import (
	"bufio"
	"gitee.com/liumou_site/logger"
	"os"
	"strings"
)

// Read 读取HOSTS文件内容，保存有效记录和注释行
func (h *Hosts) Read() error {
	h.RecordList = nil
	h.CommentLines = nil

	file, err := os.Open(h.File)
	if err != nil {
		logger.Error("打开hosts文件失败: ", err.Error())
		return err
	}
	defer func() {
		if err = file.Close(); err != nil {
			logger.Error("关闭hosts文件失败: ", err.Error())
		}
	}()

	scanner := bufio.NewScanner(file)
	lineNum := 0

	for scanner.Scan() {
		lineNum++
		line := scanner.Text()

		// 保存注释行和空行
		if strings.HasPrefix(line, "#") || len(strings.TrimSpace(line)) == 0 {
			h.CommentLines = append(h.CommentLines, line)
			continue
		}

		fields := strings.Fields(line)
		if len(fields) < 2 {
			// 对于格式不正确的行，也保存为注释
			h.CommentLines = append(h.CommentLines, "# 格式不正确的行被转换为注释: "+line)
			logger.Warn("第", lineNum, "行格式不正确，已转换为注释: ", line)
			continue
		}

		ip := fields[0]
		if !isValidIP(ip) {
			// 无效IP的行也保存为注释
			h.CommentLines = append(h.CommentLines, "# 无效IP的行被转换为注释: "+line)
			logger.Warn("第", lineNum, "行IP无效，已转换为注释: ", ip)
			continue
		}

		h.RecordList = append(h.RecordList, Record{Ip: ip, Domain: fields[1]})
	}

	if err = scanner.Err(); err != nil {
		logger.Error("扫描文件时出错: ", err.Error())
		return err
	}

	logger.Info("成功读取hosts文件，共", len(h.RecordList), "条有效记录，", len(h.CommentLines), "条注释行")
	return nil
}
